/* -------------------------------------------------------------------------
 *
 * indexfsm.cpp
 *	  openGauss free space map for quickly finding free pages in relations
 *
 *
 * Portions Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * IDENTIFICATION
 *	  src/gausskernel/storage/freespace/indexfsm.cpp
 *
 *
 * NOTES:
 *
 *	This is similar to the FSM used for heap, in freespace.c, but instead
 *	of tracking the amount of free space on pages, we only track whether
 *	pages are completely free or in-use. We use the same FSM implementation
 *	as for heaps, using BLCKSZ - 1 to denote used pages, and 0 for unused.
 *
 * -------------------------------------------------------------------------
 */
#include "postgres.h"
#include "knl/knl_variable.h"

#include "storage/freespace.h"
#include "storage/indexfsm.h"

/*
 * Exported routines
 *
 * GetFreeIndexPage - return a free page from the FSM
 *
 * As a side effect, the page is marked as used in the FSM.
 */
BlockNumber GetFreeIndexPage(Relation rel)
{
    BlockNumber blkno = GetPageWithFreeSpace(rel, BLCKSZ / 2);
    if (blkno != InvalidBlockNumber)
        RecordUsedIndexPage(rel, blkno);

    return blkno;
}

/*
 * RecordFreeIndexPage - mark a page as free in the FSM
 */
void RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
{
    RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1);
}

/*
 * RecordUsedIndexPage - mark a page as used in the FSM
 */
void RecordUsedIndexPage(Relation rel, BlockNumber usedBlock)
{
    RecordPageWithFreeSpace(rel, usedBlock, 0);
}

/*
 * IndexFreeSpaceMapVacuum - scan and fix any inconsistencies in the FSM
 */
void IndexFreeSpaceMapVacuum(Relation rel)
{
    FreeSpaceMapVacuum(rel);
}

